package com.wangdong.mijiqiqi.notification;

import android.annotation.TargetApi;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //如果检测开发适配的手机8.0以上的就会显示Notificationcompat.Builder方法废弃,这个是告诉我们需要,使用带有通知渠道的方法才行
        //Notification notification = new NotificationCompat.Builder(this).build();
        //如果targetSdkVersion 目标版本是26以下的,即使方法标为废弃,但是也可以正常使用, 但是以上就必须设置了不然完全无法弹出,所以一定要适配

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {  //判断 现在使用手机系统版本是否大于等于26
            String channelId = "chat";
            String channelName = "聊天消息";
            int importance = NotificationManager.IMPORTANCE_HIGH;
            createNotificationChannel(channelId, channelName, importance);

            channelId = "subscribe";
            channelName = "订阅消息";
            importance = NotificationManager.IMPORTANCE_DEFAULT;
            createNotificationChannel(channelId, channelName, importance);
        }

    }
    @TargetApi(Build.VERSION_CODES.O)
    private void createNotificationChannel(String channelId, String channelName, int importance) {
        // 创建通知渠道,参数;1通知的ID唯一性,2渠道名为了表达清楚渠道的用途,3渠道重要等级
        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
        channel.setShowBadge(true);//如果设置这个和下面通知设置.setNumber(2)表示角标显示,false表示禁止显示角标
        //获取通知管理者
        NotificationManager notificationManager = (NotificationManager) getSystemService(
                NOTIFICATION_SERVICE);
        //通知管理者把通知渠道
        notificationManager.createNotificationChannel(channel);
    }
    //代码不长，我来简单解释下。这里我们在MainActivity中创建了两个通知渠道，首先要确保的是当前手机的系统版本必须是Android 8.0系统或者更高，
    // 因为低版本的手机系统并没有通知渠道这个功能，不做系统版本检查的话会在低版本手机上造成崩溃。

    // 创建一个通知渠道的方式非常简单，这里我封装了一个createNotificationChannel()方法，里面的逻辑相信大家都看得懂。
    // 需要注意的是，创建一个通知渠道至少需要渠道ID、渠道名称以及重要等级这三个参数，其中渠道ID可以随便定义，只要保证全局唯一性就可以。
    // 渠道名称是给用户看的，需要能够表达清楚这个渠道的用途。重要等级的不同则会决定通知的不同行为，当然这里只是初始状态下的重要等级，
    // 用户可以随时手动更改某个渠道的重要等级，App是无法干预的。

    //重要等级:                      我和别人聊天类:IMPORTANCE_HIGH,  //可以屏幕弹出,提示音  当然可以降低重要级别,也可以关闭
    // 另一类是公众号的订阅消息，这类消息不是那么重要，IMPORTANCE_DEFAULT。//提示音
    //                 除此之外，重要等级还可以设置为IMPORTANCE_LOW、
    //                                            IMPORTANCE_MIN，分别对应了更低的通知重要程度。

    //并且创建通知渠道的代码只在第一次执行的时候才会创建，以后每次执行创建代码系统会检测到该通知渠道已经存在了，因此不会重复创建，也并不会影响任何效率。

    //触发通知的代码和之前版本基本是没有任何区别的，只是在构建通知对象的时候，需要多传入一个通知渠道ID，表示这条通知是属于哪个渠道的。

//    public void sendChatMsg(View view) { //聊天
//        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//        //channelid 就是创建渠道的id
//        Notification notification = new NotificationCompat.Builder(this, "chat")
//                .setContentTitle("收到一条聊天消息")   //标题栏
//                .setContentText("今天中午吃什么？")     //通知内容
//                .setWhen(System.currentTimeMillis())  //通知创建的时间  毫秒为单位
//                .setSmallIcon(R.mipmap.ic_launcher)     //小的图标
//                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))//大的图标
//                .setAutoCancel(true)  //如果点击通知自动取消
//                .build();  //构建
//        manager.notify(1, notification);//发送基本通知 id 区分是否是同一通知
//    }

    public void sendSubscribeMsg(View view) {  //订阅消息
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //channelid 就是创建渠道的id
        Notification notification = new NotificationCompat.Builder(this, "subscribe")
                .setContentTitle("收到一条订阅消息")
                .setContentText("地铁沿线30万商铺抢购中！")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .setAutoCancel(true)
                .build();
        manager.notify(2, notification);
    }


    //在测试上面两个通知的时候会看到左右滑动时候会出现,两个按钮,一个延时.一个对给通知的控制, 延时:是当前没有时间看,延后在看, 控制可以关闭,和关闭声音,


    //管理通知渠道
    //如果有些应用必须和通知配合时候,Android给开发者读取通知渠道配置权限,那我们可以提示用户手动改动,
    //我们把发送消息修改一下
    public void sendChatMsg(View view) {
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = manager.getNotificationChannel("chat");
            if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
                Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
                intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
                intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId());
                startActivity(intent);
                Toast.makeText(this, "请手动将通知打开", Toast.LENGTH_SHORT).show();
            }
        }

        Notification notification = new NotificationCompat.Builder(this, "chat")
                .setContentTitle("收到一条聊天消息")   //标题栏
                        .setContentText("今天中午吃什么？")     //通知内容
                        .setWhen(System.currentTimeMillis())  //通知创建的时间  毫秒为单位
                        .setSmallIcon(R.mipmap.ic_launcher)     //小的图标
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))//大的图标
                        .setAutoCancel(true)  //如果点击通知自动取消
                        .setNumber(2)//android系统未读角标显示数
                        .build();  //构建
        manager.notify(1, notification);
    }



    //除了以上管理通知渠道的方式之外，Android 8.0还赋予了我们删除通知渠道的功能，只需使用如下代码即可删除：

   // NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        //manager.deleteNotificationChannel(channelId);


//    可以看到，这里我们主要修改了两个地方。第一是在创建通知渠道的时候，调用了NotificationChannel的setShowBadge(true)方法，
    // 表示允许这个渠道下的通知显示角标。第二是在创建通知的时候，调用了setNumber()方法，并传入未读消息的数量。

    //跳转到详细Notification通知界面
public void startNotifiActivity(View view) {
        startActivity(new Intent(this,HomeActivity.class));
}
//跳转webview
    public void startwebviewActivity(View view) {
        startActivity(new Intent(this,WebviewActivity.class));
    }
}
